package net.wzw.localcache;


import com.google.common.cache.*;

import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

/**
 * @author wzw
 * @date 2025/5/3
 * @Description
 */
public class GuavaCache {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        LoadingCache<Integer, String> cache = CacheBuilder.newBuilder()
                // 设置并发级别为 8，并发级别是指可以同时写缓存的线程数
                .concurrencyLevel(8)
                // 设置缓存的初始容量为 10
                .initialCapacity(10)
                // 设置缓存最大容量为 100，超过 100 之后就会按照 LRU 最近最少使用算法来移除缓存
                .maximumSize(100)
                // 设置写缓存后 8 秒钟过期
                .expireAfterWrite(8, TimeUnit.SECONDS)
                // 设置要统计的缓存命中率
                .recordStats()
                // 设置缓存移除通知，当缓存过期后会调用该方法进行打印
                .removalListener(new RemovalListener<Object, Object>() {
                    public void onRemoval(RemovalNotification<Object, Object> notification) {
                        // 打印日志
                        System.out.println("key: " + notification.getKey() + " 数据已过期 " + notification.getCause());
                    }
                })
                // build 方法可以指定 CacheLoader，在缓存不存在时通过 CacheLoader 的实现自动加载缓存
                .build(
                        new CacheLoader<Integer, String>() {
                            @Override
                            public String load(Integer s) throws Exception {
                                // 打印日志
                                System.out.println("cache not exists load data:"+ s);
                                String str = s + ":cache-value";
                                return str;
                            }
                        }
                );

        // 循环打印
        for (int i = 0; i < 20; i++){
            // 获取缓存
            String str = cache.get(1);
            // 挨个打印
            System.out.println(str);
            // 休眠一秒
            TimeUnit.SECONDS.sleep(1);
            if (i == 10) {
                System.out.println("---------------------");
                // 调用主动删除，将某个 key 的缓存直接删除，会调用 removalListener
                cache.invalidate(1);
                System.out.println("---------------------");
            }
        }

        cache.put(2, "wzw测试");

        // 将某个 key 的缓存直接删除，会调用 removalListener
        cache.invalidate(1);
        // 将一批 key 的缓存直接删除，会调用 removalListener
        cache.invalidateAll(new ArrayList<>());
        // 删除所有缓存数据
        cache.invalidateAll();

        // 打印缓存的命中率情况
        System.out.println("cache stats:" + cache.stats().toString());
    }
}
